package cn.tedu.search.repository; 
 /*
 @Time: 2022/12/23 18:55
 @Author:GShuai
 @File:ItemRepository.class
 @Software:IntelliJ IDEA
*/

import cn.tedu.search.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

// Spring家族持久层命名规范为repository
@Repository
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
    // 当前ItemRepository可以继承SpringDataElasticsearch框架提供的父接口ElasticsearchRepository
    // 一旦继承，效果是会为指定的实体类自动生成基本的增删改查方法
    //ElasticsearchRepository<[关联的实体类名],[实体类主键类型]>

    // SpringData自定义查询
    // 遵循SpringData框架给定的格式，编写方法名称，就可以自动生成查询语句
    // query（查询）：表示当前方法是一个查询方法，类似sql中的select
    // Item\Items:表示查询的实体类，不带s返回单个对象，带s返回集合类型
    // By（通过）：标识开始设置时条件的关键字，类似sql中的where
    // Matches：执行的查询操作，Matches表示执行支持分词的字符串 ，类似sql中的like

    Iterable<Item> queryItemsByTitleMatches(String title);

    // 多条件查询
    // 多个条件之间需要使用逻辑运算符And或or来分割
    // 方法参数赋值的依据是根据方法名称参数的顺序来决定的
    //
    //
    //
    Iterable<Item> queryItemsByTitleMatchesAndBrandMatches(String title,String brand);


    // 排序查询
    Iterable<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(String title,String brand);

    // 分页查询
    // 实现分页查询：在最后一个参数的位置添加声明类型Pageable的变量
    // 返回值修改为Page类型，这个类型的对象不但能够保存查询出的数据，又能自动计算出分页信息
    // 分页信息包括：当前页，总页数，总条数，是否有上一页或下一页等
    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(String title, String brand, Pageable pageable);

}

